﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using GMAC.ReportingSystem.Business.Entities;
using FrameworkManapro.BusinessModel;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using GMAC.ReportingSystem.Business.Entities.Configuration;

namespace GMAC.ReportingSystem.Business.Components
{
    public class ASLTelecomComponent : IBusinessComponent<StringASLTelecom>
    {
        // Referencia la clase de datos
        private DataAccess.ASLTelecomAccess dac;

        // Constructor que instancia la capa de datos
        #region Constructor
            /// <summary>
            /// Constructor de la la clase de negocios que crea una instancia de la clase de datos
            /// </summary>
            public ASLTelecomComponent()
            {
                dac = new DataAccess.ASLTelecomAccess();
            } // ASLTelecomComponent
        #endregion

        // Metodos no Implementados pide que pide "IBusinessComponent"
        #region IBusinessComponent<LaoSalvageAccount> Members

            /// <summary>
            /// Metodo no implementado
            /// </summary>
            /// <param name="entityToCreate"></param>
            /// <returns></returns>
            public int Create(StringASLTelecom entityToCreate)
            {
                throw new NotImplementedException();
            } // Create

            /// <summary>
            /// Metodo no implementado
            /// </summary>
            /// <param name="entityToDelete"></param>
            /// <returns></returns>
            public int Delete(StringASLTelecom entityToDelete)
            {
                throw new NotImplementedException();
            } // Delete

            /// <summary>
            /// Metodo no implementado
            /// </summary>
            /// <param name="entityToEdit"></param>
            /// <returns></returns>
            public int Edit(StringASLTelecom entityToEdit)
            {
                throw new NotImplementedException();
            } // Edit

            /// <summary>
            /// Metodo no implementado
            /// </summary>
            /// <param name="entityId"></param>
            /// <returns></returns>
            public StringASLTelecom GetDetails(object entityId)
            {
                throw new NotImplementedException();
            } // GetDetails

        #endregion



            /// <summary>
            /// Carga el archivo "LAO SAlvage - Regional Extract" que contiene las cuentas con estatus PERDIDA
            /// </summary>
            /// <remarks>El archivo es de tipo Excel</remarks>
            /// <param name="processDate">Fecha en la que se esta procesando el archivo</param>
            /// <param name="fileName">Ruta y nombre del archivo a procesar</param>
            /// <param name="UserId">Usuari oquer ejecuta la operacion</param>
            /// <param name="LAOInvalids">Lista de los registros invalidos que se encontraron en el archivo</param>
            /// <param name="LAOValids">Lista de los registros validos que se encontraron en el archivo</param>
            public void LoadFile(DateTime processDate, string fileName, int UserId, ref StringASLTelecomCollection ASLInvalids, ref StringASLTelecomCollection ASLValids)
            {
            // Primera fila de los datos en el archivo
            int FIRST_ROW = 2;

            StringASLTelecomCollection LAORecords = new StringASLTelecomCollection();

            //  asigna las columnas donde se encuentran los datos en el archivo excel
            string COL_1_DATE	                = "A";
            string COL_2_MESSAGETYPE            = "B";
            string COL_3_RECORDSRECEIVED        = "D";
            string COL_4_RECORDSSENT            = "E";
            string COL_5_RECORDSNOTLOADED       = "F";

            var oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            var app = new Excel.Application();
            Excel.Workbook wb = null;
            var missing = Type.Missing;
            StringASLTelecom ASLRecord;

            try
            {
                string strCulture = System.Configuration.ConfigurationManager.AppSettings["Culture"];
                System.Globalization.CultureInfo infCulture = new System.Globalization.CultureInfo(strCulture);

                wb = app.Workbooks.Open(fileName, missing, true, missing, missing,
                    missing, true, missing, missing, missing, false,
                    missing, false, true, false);
                var sheet = wb.Sheets[1] as Excel.Worksheet;
                if (sheet != null)
                {
                    int i = FIRST_ROW;

                    // Formatea las letras de las columnas en el excel de las que proviene los valores
                    var cell1_DATE              = string.Format("{0}{1}", COL_1_DATE, i);
                    var cell2_MESSAGETYPE       = string.Format("{0}{1}", COL_2_MESSAGETYPE, i);
                    var cell3_RECORDSRECEIVED   = string.Format("{0}{1}", COL_3_RECORDSRECEIVED, i);
                    var cell4_RECORDSSENT       = string.Format("{0}{1}", COL_4_RECORDSSENT, i);
                    var cell5_RECORDSNOTLOADED  = string.Format("{0}{1}", COL_5_RECORDSNOTLOADED, i);

                    // declare las variables donde se capturaran los valores de cada filas del excel
                    string str_cell1_DATE               = sheet.get_Range(cell1_DATE, cell1_DATE).Text.ToString().Trim();
                    string str_cell2_MESSAGETYPE        = sheet.get_Range(cell2_MESSAGETYPE, cell2_MESSAGETYPE).Text.ToString().Trim();
                    string str_cell3_RECORDSRECEIVED    = sheet.get_Range(cell3_RECORDSRECEIVED, cell3_RECORDSRECEIVED).Text.ToString().Trim();
                    string str_cell4_RECORDSSENT        = sheet.get_Range(cell4_RECORDSSENT, cell4_RECORDSSENT).Text.ToString().Trim();
                    string str_cell5_RECORDSNOTLOADED   = sheet.get_Range(cell5_RECORDSNOTLOADED, cell5_RECORDSNOTLOADED).Text.ToString().Trim();

                    // Se hara el while mientras exista por lo menos un campo con longitudes > 0
                    while (   str_cell1_DATE.Length             > 0
                           || str_cell2_MESSAGETYPE.Length      > 0
                           || str_cell3_RECORDSRECEIVED.Length  > 0
                           || str_cell4_RECORDSSENT.Length      > 0
                           || str_cell5_RECORDSNOTLOADED.Length > 0
                          ) // while
                    {
                        // Inicializa la cadena que captura las razones de rechazo
                        //strRejectionReason = "";

                        // Instancia los objetos para capturar una fila de el archivo e insertarlos en la coleccion de los validos o los invalidos
                        ASLRecord = new StringASLTelecom();

                        ASLRecord.LoadDate          = processDate;
                        ASLRecord.dDate             = str_cell1_DATE;
                        ASLRecord.MessageType       = str_cell2_MESSAGETYPE;
                        ASLRecord.RecordsReceived   = str_cell3_RECORDSRECEIVED;
                        ASLRecord.RecordsSent       = str_cell4_RECORDSSENT;
                        ASLRecord.RecordsNotLoaded  = str_cell5_RECORDSNOTLOADED;

                        // Agrega el Item a la coleccion
                        LAORecords.Add(ASLRecord);

                     // Se mueve al siguiente registro del while
                    i++;

                    // Formatea las letras de las columnas en el excel de las que proviene los valores
                    cell1_DATE              = string.Format("{0}{1}", COL_1_DATE, i);
                    cell2_MESSAGETYPE       = string.Format("{0}{1}", COL_2_MESSAGETYPE, i);
                    cell3_RECORDSRECEIVED   = string.Format("{0}{1}", COL_3_RECORDSRECEIVED, i);
                    cell4_RECORDSSENT       = string.Format("{0}{1}", COL_4_RECORDSSENT, i);
                    cell5_RECORDSNOTLOADED  = string.Format("{0}{1}", COL_5_RECORDSNOTLOADED, i);                    

                    // vuelve a capturar los valores de la siguiente fila del excel para el while
                    str_cell1_DATE              = sheet.get_Range(cell1_DATE, cell1_DATE).Text.ToString().Trim();
                    str_cell2_MESSAGETYPE       = sheet.get_Range(cell2_MESSAGETYPE, cell2_MESSAGETYPE).Text.ToString().Trim();
                    str_cell3_RECORDSRECEIVED   = sheet.get_Range(cell3_RECORDSRECEIVED, cell3_RECORDSRECEIVED).Text.ToString().Trim();
                    str_cell4_RECORDSSENT       = sheet.get_Range(cell4_RECORDSSENT, cell4_RECORDSSENT).Text.ToString().Trim();
                    str_cell5_RECORDSNOTLOADED  = sheet.get_Range(cell5_RECORDSNOTLOADED, cell5_RECORDSNOTLOADED).Text.ToString().Trim();

                    } // while
                    
                    dac.UploadLoanFile(processDate, UserId, LAORecords, ref ASLInvalids, ref ASLValids);
                } // if (sheet != null)
                else
                {
                    throw new ApplicationException("File invalid.");
                }
            } // try
            catch
            {
                throw;
            } // catch
            finally
            {
                if (wb != null)
                {
                    wb.Close(false, missing, missing);
                    Marshal.FinalReleaseComObject(wb);
                } // if
                if (true)
                {
                    app.Quit();
                    Marshal.FinalReleaseComObject(app);
                } // if
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();
                System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;

            } // finally
        } // LoadFile


        /// <summary>
        /// Metodo que inserta los registros valios del archivo excel
        /// </summary>
        /// <param name="typeFile">Tipo de archivo</param>
        /// <param name="UserId">Usuario que procesa el archivo</param>
        public void GenerateUploadFile(int UserId)
        {
            dac.GenerateUploadFile(UserId);
        } // GenerateUploadFile

        /// <summary>
        /// Recibe una coleccion y la retorna ordenada segun indiquen los parametros
        /// </summary>
        /// <param name="records">Coleccion de valores a ordenar</param>
        /// <param name="column">Campo por el que va a ordenar</param>
        /// <param name="order">"ASC" o "DESC"</param>
        /// <returns>Lista ordenada</returns>
        public StringASLTelecomCollection sord(StringASLTelecomCollection records, string column, string order)
        {
            return dac.sord(records, column, order);
        } // sord

        /// <summary>
        /// Valida si los datos son numericos
        /// </summary>
        /// <param name="value">Valor a validar</param>
        /// <returns>
        /// true: Es Valido
        /// false: No es Valido
        /// </returns>
        public bool IsNumeric(string value)
        {
            try
            {
                long.Parse(value);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        } // IsNumeric

        /// <summary>
        /// Valida si los datos son Decimales
        /// </summary>
        /// <param name="value">Valor a validar</param>
        /// <returns>
        /// true: Es Valido
        /// false: No es Valido
        /// </returns>
        public bool IsDecimal(string value)
        {
            try
            {
                decimal.Parse(value);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        } // IsDecimal

        /// <summary>
        /// Valida si los datos son Date
        /// </summary>
        /// <param name="value">Valor a validar</param>
        /// <returns>
        /// true: Es Valido
        /// false: No es Valido
        /// </returns>
        public bool IsDate(string value)
        {
            try
            {
                string strCulture = System.Configuration.ConfigurationManager.AppSettings["Culture"];

                DateTime.Parse(value, new System.Globalization.CultureInfo(strCulture));

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        } // IsDate


    } // class
} // namespace
